﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UricaoWeb.LogicaDeNegocios.Empleados;
using UricaoWeb.Datos.Excepciones.Empleado;
using UricaoWeb.LogicaDeNegocios.Cargos;
using System.Globalization;
using System.Text.RegularExpressions;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;


namespace UricaoWeb.Presentacion
{
    public partial class API_empleado_modificar : API_Seguridad_Principal
    {
        #region Variables Locales
        private string _id;
        private EmpleadoLogico _empleado;
        Cargo _cargoEmpleado = new Cargo();
        private List<Cargo> _listaCargos = new List<Cargo>();
        private List<string> _listaNombreCargos = new List<string>();
        private LogicaNegocioEmpleado _controlador = new LogicaNegocioEmpleado();
        #endregion
        public static int _fkHotel; 


        #region Metodos
        /// <summary>
        /// Método Es el constructor por defecto de la clase, carga informacion del empleado seleccionado
        /// </summary>
        /// 
        protected void Regresar(object sender, EventArgs e)
        {
            Response.Redirect("API_Empleado_Consultar.aspx");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["user"] != null)
            {
                Logica_Usuario usuario = (Logica_Usuario)Session["user"];
                _fkHotel = Convert.ToInt32(usuario.FkHotel);

                var master = Master as MasterPage;
                if (master != null)
                {
                    master.actualizar_label();
                }
                base.validar_usuario();
                if (Request.QueryString["id"] != null)
                {
                    ///Obtiene el ID del empleado seleccionado
                    _id = Request.QueryString["id"];
                    _empleado = _controlador.EmpleadoUnicoLogico(Int32.Parse(_id), (_fkHotel));
                    //_empleado = _controlador.EmpleadoUnicoLogico(Int32.Parse(_id));

                    _listaCargos = _cargoEmpleado.ConsultarCargosGeneral().ToList<Cargo>();

                    /// Asigna el estado del switch segun el estado del empleado
                    if (_empleado.Empleado.EstatusEmpleado)
                        InputValue = "checked";
                    else
                        InputValue = "";

                    if (!Page.IsPostBack)
                    {
                        ///Lleva el DropDownList con los cargos
                        _listaNombreCargos = LlenarCargos(_listaNombreCargos, _listaCargos);
                        _cargoEmpleado = _cargoEmpleado.ConsultarCargoPorId(_empleado.Empleado.FkCargo);

                        /// Llena con TextBox con el contenido del empleado seleccionado
                        nombreTxtBox.Text = _empleado.Empleado.NombreEmpleado;
                        apellidoTxtBox.Text = _empleado.Empleado.ApellidoEmpleado;
                        fechaNacTxtBox.Text = _empleado.Empleado.FechaNacimientoEmpleado.ToString("yyyy-MM-dd");
                        correoTxtBox.Text = _empleado.Empleado.CorreoEmpleado;
                        direccionTxtBox.Text = _empleado.Empleado.DireccionEmpleado;
                        cargoDropDown.DataSource = _listaNombreCargos;
                        cargoDropDown.DataBind();
                        cargoDropDown.SelectedIndex = cargoDropDown.Items.IndexOf(cargoDropDown.Items.FindByText(_cargoEmpleado._nombre));
                    }
                }
            }
            else
            {
                Server.Transfer("API_Seguridad_Login_.aspx", false);
            }
        }

        // Switch / check
        protected string InputValue { get; set; }

        /// <summary>
        /// Método llena una lista con los nombres de los cargos
        /// Parámetros: 
        /// List<string> listaNombreCargos:
        /// Retorno: 
        /// List<string>: Lista con los nombres de los cargos
        /// </summary>

        private List<string> LlenarCargos(List<string> _listaNombreCargos, List<Cargo> _listaCargos)
        {
            _listaNombreCargos.Add("Elija un cargo...");

            foreach (Cargo x in _listaCargos)
            {
                _listaNombreCargos.Add(x._nombre);
            }
            return _listaNombreCargos;
        }

        /// <summary>
        ///Metodo que valida campos vacios.
        /// </summary>
        /// <returns>Retorna true si no hay campos vacios</returns>

        public bool ValidarCamposVacios(string nombre, string apellido, string correo, string fecha, string direccion)
        {
            if (nombre.Equals("") || apellido.Equals("") || correo.Equals("") || fecha.Equals("") || direccion.Equals(""))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        ///Metodo que verifica los caracteres permitidos en los campo nombre y apellido del empleado, los cuales son:
        ///letra y espacios en blancos.
        /// </summary>
        /// <returns>Retorna true si cumple con los caracteres permitidos, en caso contrario retorna false</returns>
        private bool VerificarCaracteres()
        {
            string expresionesRegulares = "^[A-Z a-z]*$";
            Regex rgTexto = new Regex(expresionesRegulares);

            if (rgTexto.IsMatch(nombreTxtBox.Text) && (rgTexto.IsMatch(nombreTxtBox.Text)))
                return true;
            else
                return false;
        }

        /// <summary>
        ///Metodo que verifica sintaxticamente el correo del empleado.
        /// </summary>
        /// <returns>Retorna true si cumple con los caracteres permitidos, en caso contrario retorna false</returns>
        private bool VerificarCorreo()
        {
            string expresionesRegulares = "^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$";
            if ((Regex.IsMatch(correoTxtBox.Text, expresionesRegulares)) && (_controlador.ValidarCorreoModificar(correoTxtBox.Text,Convert.ToInt32(_id))))
                return true; 
            return false;
        }

        /// <summary>
        /// Método llena una lista con los nombres de los cargos
        /// Parámetros: 
        /// List<string> listaNombreCargos:
        /// Retorno: 
        /// List<string>: Lista con los nombres de los cargos
        /// </summary>
        private List<string> LlenarCargos(List<string> listaNombreCargos)
        {          
            foreach (Cargo x in _listaCargos)
            {
                 listaNombreCargos.Add(x._nombre);
            }
            return listaNombreCargos;
        }



        /// <summary>
        /// Método que obtiene los datos de los TextBox para ser modificados
        /// Parámetros: 
        /// object sender: Objeto que ha generado el evento
        /// EventArgs e: Contiene los datos del evento
        /// Excepciones posibles:
        /// Excepciones particular 1
        /// Excepciones particular 2
        /// </summary>
        protected void ModificarEmpleado(object sender, EventArgs e)
        {
            if (ValidarCamposVacios(nombreTxtBox.Text, apellidoTxtBox.Text, correoTxtBox.Text, fechaNacTxtBox.Text, direccionTxtBox.Text))
            {
                if (VerificarCaracteres())
                {
                    if (VerificarCorreo())
                    {
                        if (cargoDropDown.SelectedIndex != -1)
                        {
                            _empleado = new EmpleadoLogico();
                            _empleado.Empleado.IdEmpleado = Convert.ToInt32(_id);
                            _empleado.Empleado.NombreEmpleado = nombreTxtBox.Text;
                            _empleado.Empleado.ApellidoEmpleado = apellidoTxtBox.Text;
                            _empleado.Empleado.CorreoEmpleado = correoTxtBox.Text;
                            _empleado.Empleado.FechaNacimientoEmpleado = DateTime.Parse(fechaNacTxtBox.Text);
                            _empleado.Empleado.DireccionEmpleado = direccionTxtBox.Text;

                            if (Request.Form["onoffswitch"] == "on")
                                _empleado.Empleado.EstatusEmpleado = true;
                            else
                                _empleado.Empleado.EstatusEmpleado = false;

                            _empleado.Empleado.FkCargo = _cargoEmpleado.ConsultarCargoPorNombre(cargoDropDown.SelectedItem.Text)._id;

                            if (_controlador.ActualizarEmpleadoLogico(_empleado))
                            {
                                string scriptText = "alert('Se modifico el empleado satisfactoriamente'); window.location='" + Request.ApplicationPath + "../Presentacion/API_Empleado_Consultar.aspx';";
                                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertMessage", scriptText, true);
                            }
                            else
                                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo modificar el empleado')", true);
                        }
                        else
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo modificar el empleado, debe seleccionar un cargo')", true);
                    }
                    else
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo modificar el empleado, el campo correo no cumple el formato o ya existe')", true);
                }
                else
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo modificar el empleado, los campos nombre y apellido solo permiten letras')", true);
            }
            else
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo modificar el empleado, debe rellenar todos los campos')", true);
        }
        #endregion
    }
}